package com.zdsx.utils;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;


@Slf4j
public class WxUtil {

    public static String jscode2session(String appid, String secret, String code) {
        BufferedReader in = null;
        //appid和secret是开发者分别是小程序ID和小程序密钥，开发者通过微信公众平台-》设置-》开发设置就可以直接获取，
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid="
                + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
        try {
            URL weChatUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection connection = weChatUrl.openConnection();
            // 设置通用的请求属性
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            // 建立实际的连接
            connection.connect();
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
    }

    // TODO 获取微信昵称？？
    public static String getNickName(String code, String appId, String secret) {
        String jsonId = jscode2session(appId, secret, code);
        JSONObject jsonObject = JSONObject.parseObject(jsonId);
        return jsonObject.getString("nickname");
    }


    public static JSONObject decodeUserInfo(String code, String appId, String secret) {
        String jsonId = jscode2session(appId, secret, code);
        log.info("wx user info: " + jsonId);
        return JSONObject.parseObject(jsonId);
    }

    //通过code获取openid
    public static String getOpenId(String code, String appId, String secret) {
        JSONObject jsonObject = decodeUserInfo(code, appId, secret);
        String openid = jsonObject.getString("openid");
//        String sessionKey = jsonObject.getString("session_key");
        return openid;
    }

    // 这种已经不支持了
    // https://blog.csdn.net/liben0429/article/details/90719094
    // https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801
    @Deprecated
    public static Map<String, Object> getOpenId(String encryptedData, String iv, String code, String appid, String secret) {
        return null;
//        Map<String, Object> map = new HashMap();
//        //登录凭证不能为空
//        if (code == null || code.length() == 0) {
//            map.put("status", 0);
//            map.put("msg", "code 不能为空");
//            return map;
//        }
//
//        //小程序唯一标识   (在微信小程序管理后台获取)
//        String wxspAppid = appid;
//        //小程序的 app secret (在微信小程序管理后台获取)
//        String wxspSecret = secret;
//        //授权（必填）
//        String grant_type = "***************************";
////        1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
//        //请求参数
//        String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
//        //发送请求
//        String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
//        //解析相应内容（转换成json对象）
//        JSONObject json = JSONObject.parseObject(sr);
//        //获取会话密钥（session_key）
//        String session_key = json.get("session_key").toString();
//        //用户的唯一标识（openid）
//        String openid = (String) json.get("openid");
//
//        // 2、对encryptedData加密数据进行AES解密
//        try {
//            String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
//            if (null != result && result.length() > 0) {
//                map.put("status", 1);
//                map.put("msg", "解密成功");
//
//                JSONObject userInfoJSON = JSONObject.parseObject(result);
//                Map userInfo = new HashMap();
//                userInfo.put("openId", userInfoJSON.get("openId"));
//                userInfo.put("nickName", userInfoJSON.get("nickName"));
//                userInfo.put("gender", userInfoJSON.get("gender"));
//                userInfo.put("city", userInfoJSON.get("city"));
//                userInfo.put("province", userInfoJSON.get("province"));
//                userInfo.put("country", userInfoJSON.get("country"));
//                userInfo.put("avatarUrl", userInfoJSON.get("avatarUrl"));
//                userInfo.put("unionId", userInfoJSON.get("unionId"));
//                map.put("userInfo", userInfo);
//                return map;
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        map.put("status", 0);
//        map.put("msg", "解密失败");
//        return map;
    }

}
